import type { RealmBigLevelType } from '../../data/realm';
import {
  CharacterAttributes,
  DEFAULT_INITIAL_BASE_ATTRIBUTES,
} from './character-attributes';
import { type Attribute } from './type';

/**
 * 属性配置接口
 * 定义创建CombatAttributes实例时的配置选项
 */
export interface AttributesConfig {
  /** 属性计算模式：固定值或基于等级成长 */
  mode: 'fixed' | 'level';

  /** 固定属性模式下的属性值 */
  fixedAttributes?: Attribute;

  /** 等级成长模式下的配置 */
  levelBasedConfig?: {
    /** 基础属性（1级时的属性） */
    baseAttributes: Attribute;
    /** 各属性成长系数 */
    growthFactors: Partial<Attribute>;
    /** 初始等级，默认为1 */
    initialLevel?: number;
    initialRealm?: {
      bigLevelType: RealmBigLevelType;
      smallLevel?: number; // 默认 1
    };
  };
}

/**
 * 战斗属性类
 * 继承自CharacterAttributes，提供两种属性管理方式：
 * - 固定属性模式：属性值固定，不随等级变化
 * - 等级成长模式：属性值随等级成长而变化
 */
export class CombatAttributes extends CharacterAttributes {
  /** 属性配置模式 */
  private mode: 'fixed' | 'level';
  /** 境界配置（仅在等级模式下有效） */
  private realmConfig?: {
    bigLevelType: RealmBigLevelType;
    smallLevel: number;
  };

  /**
   * 构造函数
   * @param config 属性配置对象
   */
  constructor(config: AttributesConfig) {
    const { mode } = config;

    if (mode === 'fixed') {
      // 固定模式：使用固定属性，不应用任何成长和境界
      super(config.fixedAttributes || DEFAULT_INITIAL_BASE_ATTRIBUTES);
      this.markFixedMode();
    } else {
      // 等级成长模式
      const lc = config.levelBasedConfig!;
      super(lc.baseAttributes);
      this.setGrowthFactors(lc.growthFactors);

      if (lc.initialLevel && lc.initialLevel > 1) {
        super.setLevel(lc.initialLevel);
      }

      // 保存境界配置，在固定模式下不应用
      if (lc.initialRealm) {
        this.realmConfig = {
          bigLevelType: lc.initialRealm.bigLevelType,
          smallLevel: lc.initialRealm.smallLevel || 1,
        };
        // 立即应用境界（仅在等级模式下）
        super.setRealm(
          lc.initialRealm.bigLevelType,
          lc.initialRealm.smallLevel || 1
        );
      }
    }

    this.mode = mode;
  }

  public setAttributesConfig(config: AttributesConfig) {
    const { mode } = config;
    if (mode === 'fixed') {
      // 固定模式：使用固定属性，不应用任何成长和境界
      this.resetInitialBaseAttributes(
        config.fixedAttributes || DEFAULT_INITIAL_BASE_ATTRIBUTES
      );
      this.markFixedMode();
    } else {
      // 等级成长模式
      const lc = config.levelBasedConfig!;
      this.resetInitialBaseAttributes(lc.baseAttributes);
      this.setGrowthFactors(lc.growthFactors);
      if (lc.initialLevel && lc.initialLevel > 1) {
        super.setLevel(lc.initialLevel);
      }
      // 保存境界配置，在固定模式下不应用
      if (lc.initialRealm) {
        this.realmConfig = {
          bigLevelType: lc.initialRealm.bigLevelType,
          smallLevel: lc.initialRealm.smallLevel || 1,
        };
        // 立即应用境界（仅在等级模式下）
        super.setRealm(
          lc.initialRealm.bigLevelType,
          lc.initialRealm.smallLevel || 1
        );
      }
    }
  }

  public setBattleLevel(lv: number) {
    if (this.mode === 'fixed') throw new Error('固定模式不可升级');
    super.setLevel(lv);
  }

  public setRealm(big: RealmBigLevelType, small = 1) {
    if (this.mode === 'fixed') {
      throw new Error('固定属性模式不支持设置境界');
    }
    this.realmConfig = { bigLevelType: big, smallLevel: small };
    super.setRealm(big, small);
  }

  /**
   * 获取属性配置模式
   * @returns 当前属性模式（fixed 或 level）
   */
  getMode(): 'fixed' | 'level' {
    return this.mode;
  }

  /**
   * 设置属性等级（仅等级成长模式有效）
   * @param level 要设置的等级
   * @throws 在固定属性模式下调用此方法会抛出错误
   */
  setLevel(level: number): void {
    if (this.mode === 'fixed') {
      throw new Error('固定属性模式不支持设置等级');
    }
    super.setLevel(level);
  }

  /**
   * 获取属性快照
   * @returns 包含完整属性信息的快照对象，包括初始值、基础值、最终值、修饰器和当前模式
   */
  public getAttributeSnapshot() {
    const snapshot = super.getAttributeSnapshot();
    return {
      ...snapshot,
      mode: this.mode,
      realm: this.realmConfig,
    };
  }
}
